package utils

import (
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"github.com/joho/godotenv"
	"log"
	"os"
	"time"
)

// 加载.env文件
func init() {
	err := godotenv.Load()
	if err != nil {
		log.Fatalf("Error loading .env file: %v", err)
	}
}

// SecretKey 从.env文件中获取JWT_SECRET
var SecretKey = []byte(os.Getenv("JWT_SECRET"))

// GenerateToken 生成 JWT 令牌
func GenerateToken(username, role string, userID uint) (string, error) {
	// 创建声明
	claims := jwt.MapClaims{
		"username": username,
		"role":     role,
		"userID":   userID,
		"exp":      time.Now().Add(time.Hour * 24).Unix(), // 令牌过期时间设置为 24 小时后
	}

	// 创建一个新的令牌对象，指定签名方法为 HS256
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 使用密钥对令牌进行签名并获取字符串形式的令牌
	tokenString, err := token.SignedString(SecretKey)
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

// ValidateToken 验证 JWT 令牌
func ValidateToken(tokenString string) (*jwt.Token, error) {
	// 解析令牌
	return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法是否为预期的 HS256
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, errors.New("签名方法错误")
		}
		// 返回用于验证的密钥
		return SecretKey, nil
	})
}
